module hip.loaders.tilemap;
import hip.filesystem.hipfs;
import hip.asset_manager.load_task;
import hip.assetmanager;
import hip.api.data.commons;

final class HipTilemapLoadTask : HipAssetLoadTask
{
    private HipFSPromise fs;
    this(string path, string name, HipAsset asset, const(ubyte)[] extraData, string fileRequesting, size_t lineRequesting)
    {
        super(path,name,asset,extraData,fileRequesting,lineRequesting);
    }

    override void update()
    {
        final switch(result) with (HipAssetResult)
        {
            case waiting:
                result = loading;
                worker = HipAssetManager.loadWorker("Load and Decode TileMap", ()
                {
                    HipFS.read(path)
                    .addOnError((string err){error = err; result = cantLoad;})
                    .addOnSuccess((in ubyte[] data)
                    {
                        HipTilemap.readTiledJSON(path, data, (HipTilemap map)
                        {
                            asset = map;
                            map.loadImages((){result = mainThreadLoading;}, (){error = "Failed at Loading Images"; result = cantLoad;});
                        }, (){result = cantLoad;});
                        return FileReadResult.free;
                    });
                });
                break;
            case loading:
                break;
            case mainThreadLoading:
                HipTilemap map = cast(HipTilemap)asset;
                if(!map.loadTextures())
                {
                    error = "Could not load Texture from Tilemap";
                    result = cantLoad;
                    return;
                }
                result = loaded;
                break;
            case cantLoad: goto case loaded;
            case loaded:
                break;
        }
    }

}